//数组nums包含从0到n的所有整数，但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗？ 
//
// 注意：本题相对书上原题稍作改动 
//
// 示例 1： 
//
// 输入：[3,0,1]
//输出：2 
//
// 
//
// 示例 2： 
//
// 输入：[9,6,4,2,3,5,7,0,1]
//输出：8
// 
//
// Related Topics 位运算 数组 哈希表 数学 排序 👍 130 👎 0


package LeetCode.editor.cn;


import java.util.HashSet;
import java.util.Set;

/**
 * @author ldltd
 * @date 2025-09-12 19:50:47
 * @description 面试题 17.04.消失的数字
 
 */
 
public class MissingNumberLcci {
    public static void main(String[] args) {
    //测试代码
    MissingNumberLcci fun = new MissingNumberLcci();
    Solution solution= fun.new Solution();
    
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int missingNumber1(int[] nums) {
        int n = nums.length;
        int expectedSum = n * (n + 1) / 2; // 计算从0到n的整数和
        int actualSum = 0;
        for (int num : nums) {
            actualSum += num; // 计算数组中所有元素的和
        }
        return expectedSum - actualSum; // 缺失的数字即为两者之差
    }

    public int missingNumber2(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            set.add(nums[i]);
        }
        int missing = -1;
        for (int i = 0; i <= n; i++) {
            if (!set.contains(i)) {
                missing = i;
                break;
            }
        }
        return missing;
    }
    // 每个数异或自己就是0
    public int missingNumber(int[] nums) {
        int xor = 0;
        int n = nums.length;
        // 数组中的数异或
        for (int i = 0; i < n; i++) {
            xor ^= nums[i];
        }
        // 因为是0~n,其余的数都会再被异或一次变成0
        for (int i = 0; i <= n; i++) {
            xor ^= i;
        }
        return xor;
    }



}

//leetcode submit region end(Prohibit modification and deletion)

}
